/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.asportoonline.entities;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

/**
 * Questa classe rappresenta i prodotti, con le relative quantita', associati alle prenotazioni.
 * 
 * @author fe 
 */
@Entity
public class ProdottoPrenotato implements Serializable {
    private static final long serialVersionUID = 1L;

    
    
    /* CAMPI DI PRODOTTOPRENOTATO */
    @EmbeddedId
    protected ProdottoPrenotatoID idProdottoPrenotato;
    
    //name="campo di riferimento della classe embedded"
    //referencedColumnName="campo di riferimento della tabella principale (prenotazione)"
    @JoinColumn(name = "idpren", referencedColumnName = "idPrenotazione", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Prenotazione pren;

    @JoinColumn(name = "idprod", referencedColumnName = "idProdotto", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Prodotto prod; 
    
    @Column(nullable=false)
    private int quantita;
    
    
    
    
    /* COSTRUTTORI */
    /**
     * Crea una nuova istanza di ProdottoPrenotato.
     */
    public ProdottoPrenotato() {}
    
    
    
    
    /* GETTER AND SETTER 
     *
     * N.B.: a differenza delle altre entita', in ProdottoPrenotato sia  'pren'  che  'prod' non
     *       sono campi della tabella del DB, ma servono solo per indicare che sono chiavi esterne.
     *       Come si puo' vedere all'interno dell'annotazione @JoinColum, 'prod' e 'pren' non si
     *       possono creare ne' modificare a partire da questa entita' (ovviamente!!), e quindi
     *       servono solo i metodi get, non i set.
     */

    /**
     * @return ID dell'istanza.
     * @see ProdottoPrenotatoID
     */
    public ProdottoPrenotatoID getIdProdottoPrenotato() {
        return idProdottoPrenotato;
    }

    /**
     * Imposta l'ID dell'istanza.
     * 
     * @param idProdottoPrenotato 
     * @see ProdottoPrenotatoID
     */
    public void setIdProdottoPrenotato(ProdottoPrenotatoID idProdottoPrenotato) {
        this.idProdottoPrenotato = idProdottoPrenotato;
    }

    /**
     * @return prenotazione di appartenenza.
     * @see Prenotazione
     */
    public Prenotazione getPren() {
        return pren;
    }

    /**
     * @return prodotto associato all'istanza
     * @see Prodotto
     */
    public Prodotto getProd() {
        return prod;
    }

    /**
     * @return quantita' del prodotto prenotata.
     */
    public int getQuantita() {
        return quantita;
    }

    /**
     * Imposta la quantita' del prodotto prenotata.
     * 
     * @param quantita 
     */
    public void setQuantita(int quantita) {
        this.quantita = quantita;
    }

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }
    
    
    
    
    /* EQUALS AND HASHCODE */

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final ProdottoPrenotato other = (ProdottoPrenotato) obj;
        if (this.idProdottoPrenotato != other.idProdottoPrenotato && (this.idProdottoPrenotato == null || !this.idProdottoPrenotato.equals(other.idProdottoPrenotato))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 11 * hash + (this.idProdottoPrenotato != null ? this.idProdottoPrenotato.hashCode() : 0);
        return hash;
    }

    
    
    /* METODI TOSTRING */
    @Override
    public String toString() {
        return "ProdottoPrenotato{" + "idProdottoPrenotato=" + idProdottoPrenotato + ", pren=" + pren + ", prod=" + prod + ", quantita=" + quantita + '}';
    }
    
}
